今天會來介紹幾個常用的泛型集合類別。
所有的泛型集合類別都位於 System.Collections.Generic 這個命名空間,所以沒有 using 的話,可能就沒有辦法像範例程式碼一樣使用。
與 Array 相似的類別,但差別在於 Array 在建立的時候,就會決定陣列大小,但 List 不會。用簡單的方法來說就是,Array 像是百貨公司,蓋在同一塊地(記憶空間)),但是每一層樓(型別)規模一樣,並且樓層數早就決定好了,而 List 則像是便利商店,雖然只有一層樓(型別),但蓋在各個地方(記憶空間),想蓋幾間就幾間。這我就忘了在哪邊看到的比喻了,簡單又好懂。
使用方法如
var list = new List<string> ();
list.Add ("Mio");
list.Add ("Miffy");
list.Add ("Lulu");
list.Add ("NekoSan");
Console.WriteLine ($"Hi, I am {list[0]}");
list.Sort ();
Console.WriteLine ($"Hi, I am {list[0]}");
List 在添加東西時,是使用 Add () 這個方法添加到集合的最後一個元素後面,取值則類似 Array 使用索引存取運算子,而 Sort () 則會重新排列集合元素,但如果自定義類別想要使用排序時呢?那麼就需要實作 IComparable 介面,或者使用時給予排列的方法。
class Program {
static void Main (string[] args) {
var list = new List<Member> ();
list.Add (new Member () { ID = 6 });
list.Add (new Member () { ID = 7 });
list.Add (new Member () { ID = 4 });
list.Sort ();
list.Sort ((x, y) => { return -x.ID.CompareTo (y.ID); });
}
}
class Member : IComparable {
public int ID;
public int CompareTo (object obj) => this.ID.CompareTo (((Member) obj).ID);
}
List 還有很多很方便的方法,移除 List 元素像 Remove () 或者 RemoveAt (),搜尋 List 元素如 Contains ()、IndexOf ()、LastIndexOf () 以及 BinarySearch (),前三者除了 LastIndexOf () 是從最後一個元素開始之外,都是以第一個元素開始,檢查每個元素,直到符合目標的第一個元素,所以 IndexOf () 傳回符合目標的第一個索引,而 LastIndexOf () 傳回符合目標的最後一個索引。
關於 List 的方法還有很多,可以自己去點點看。
題外話:初始化時也可以同時賦值如
var list = new List<string> () { "Mio", "Miffy", "Lulu", "NekoSan" };
字典類型,有著 key-value 對照表的集合,key 值除了無法重複之外,無任何的限制,也因為有著對照表的關係,使得字典類型查詢效率高。
var dictionary = new Dictionary<string, string> () {
["0"] = "Mio", ["2"] = "Lulu", ["1"] = "Miffy"
};
dictionary.Add ("3", "NekoSan");
Console.WriteLine ($"Hi, I am {dictionary["0"]}");
一樣透過 Add () 新增元素,加入時一樣會放到集合最後一個位置,這邊把本來的數字格式改成字串格式,強調取值時是以 key 的型別去取得符合的元素,而不是像 Array 與 List 找集合位置,若找不到符合的元素則會傳回錯誤。
可透過 Remove () 刪除一個 key,查詢時可以用 ContainsKey () 來確認是否有符合的 Key,或 ContainsValue () 來查詢符合的 value,更多內容都可以去點點看。
本來想把常用的集合類別講完,但礙於一些個人問題,所以就分成兩篇了,明天才會做一次總結。
感謝閱讀。